#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//	////利用指针来访问数组
//	//int* p = arr;
//	//int i = 0;
//	//for (i=0;i<10;i++)
//	//{
//	//	printf("%d\n",*(p+i));
//	//}
//
//	int(*p)[10] = &arr;
//	int i = 0;
//	for (i=0;i<10;i++)
//	{
//		printf("%d\n",(*p)[i]);//arr[i]
//		//(*p)相当于解引用于整个数组，[i]访问数组的第i个元素
//	}
//
//	printf("%d", 2["hello world"]);
//
//	return 0;
//}


//二维数组传参，形参写成二维数组的形式
// arr  int arr[3][4]
//二维数组传参，形参写成指针的形式
//arr 二维数组的首元素的地址，是整个第一行一维数组的地址，为数组指针
//用p去接收，为int (*p)[3]
//p+i,就是指向第i行的地址
//对p+i解引用，即*（p+i），解出来的数据是整个一行的数组
//先解出来一个数组，再打印出数组中的每一个元素
//(*(p+i))[j]可以遍历整个二维数组。


//访问二维数组的元素，利用函数传参
//void print1(int arr[3][4],int line,int row)
//{
//	int i = 0;
//	int j = 0;
//	for (i=0;i<line;i++)
//	{
//		for (j=0;j<row;j++)
//		{
//			printf("%d ",arr[i][j]);
//		}
//		printf("\n");
//	}
//}

//void print2(int(*p)[4], int line, int row)//int (*p)[i],这个i是当前数组的元素
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < line; i++)
//	{
//		for (j = 0; j < row; j++)
//		{
//			//printf("%d ", (*(p + i))[j]);
//			printf("%d ", p[i][j]);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][4] = { {1,2,3,4},{2,2,3,4},{3,2,3,4}};
//	//print1(arr,3,4);//整个数组作为实参进行传递
//	print2(arr, 3, 4);//考虑作为指针进行传参,数组指针，代表二维数组第一行的数组的地址
//	return 0;
//}


//数组指针用于二维数组传参，int (*p)[10]
//表示出二维数组中的每一个元素p[i][j]

//int arr[10];//arr的类型是 int*
//int (*p)[10]//p的类型是 int（*）[10]

//将arr的int*强转为int (*)[10],表示方式为int (*p)[10]=(int(*)[10])arr

//数组指针通常运用在二维数组上

//int (*arr[10])[5]
//这是一个数组，因为，先看*arr[10],*没有被圈起来，说明arr先与[]结合，
//说明是一个数组，然后把arr[10]拿掉，变成了int (*)[5],说明数组里的每一个元素都是
//数组指针

//数组传参，形参的部分可以是数组，可以不指定大小，类型交代清楚就可以，如下：
//void test(int arr[])
//{}
//void test(int arr[10])
//{}
//指针传参，形参的部分为指针
//void test(int* arr)
//{}


//数组名是首元素的地址，数组中的元素是整型，所以这个地址是整型指针
//所以在传递数组名作为实参时，他的接收形参部分为整型指针，int*

//int* arr2[20] = {};//指针数组，数组中的每一个元素都是指针，
//指针类型为int*   这里arr2的类型为指针，形参部分既可以用数组
//接收，也可以用指针接收  可以观察到每一个元素的类型都为int*,int*的地址为 int** 
//是一个二级指针


//int arr[3][5]={0};
//二维数组传参，形参可以是数组，形参数组的行和列的数字不可以全部省略
//可以表示为int arr[3][5]或者int arr[][5],行可以省略，列一定不能省略
//像int arr[][]这种形参是错误的


//二维数组传参，形参部分可以是指针，二维数组的每一个元素都是
//一维数组，一维数组的指针是数组指针 

//二维数组的数组名，是第一行一维数组的地址